Skip to content

js hook

元信息

  • 目标:理解模块化缺失年代的"外挂"手法——钩子与猴子补丁如何拦截、观测、改写既有函数行为,读懂逆向分析与调试场景里的 Hook 代码
  • 关键概念:hook、猴子补丁、函数重写、Proxy、Reflect、defineProperty
  • 关联阶段:cp3
  • 常见误区:以为 Hook 是浏览器提供的专门 API(只是"函数是对象、可替换包裹"的语言特性运用);以为 Hook 后原函数就废弃了(保留 _原函数名 引用再包一层才是正道,否则破坏程序逻辑);以为 Hook 只用于逆向(框架桩、监控埋点、测试 mock 同源)

1️⃣ 什么是 JSHook


JSHook本质上是一种拦截和修改 JavaScript 函数行为的技术。 在 JS 逆向中,它通常用于:

  • 拦截网页或 APP 内的关键函数,获取调用参数、返回值。
  • 修改函数行为,例如跳过验证逻辑或返回特定值。
  • 调试或分析加密/混淆算法

原理

在 JavaScript 中,函数是对象,所以可以替换或包裹函数。 常用的手段包括:

  • 重写函数:直接覆盖原函数。
  • Proxy/Reflect:动态拦截对象方法。
  • Monkey Patch:动态替换方法并保留原始调用。

2️⃣ 常见 Hook 技术与方法


2.1 重写函数

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

✅ 场景:获取加密函数输入输出、调试加密逻辑。

2.2 Proxy/Reflect 拦截对象

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

若要拦截函数调用本身,apply 陷阱要求代理的目标必须是一个函数:

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

✅ 场景:Hook 对象方法、监控参数和返回值,尤其适合封装在对象里的 API。

2.3 替换原生方法

浏览器提供了大量原生方法可用于 Hook:

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

✅ 场景:抓包、修改网络请求、绕过反爬虫检测。

类似的可以 Hook XMLHttpRequest, WebSocket, console.log, localStorage 等。

2.4 拦截对象属性(getter/setter)

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

✅ 场景:修改关键变量返回值,绕过权限或验证逻辑。

2.5 Hook 定时器和事件

setTimeout, setInterval 常用于加密/防刷检测,Hook 可以劫持它们:

import "./styles.css";

document.getElementById("app").innerHTML = `
<h1>Hello world</h1>
`;

类似地可以 Hook addEventListener 捕获事件回调。

3️⃣ JS逆向中 Hook 的应用场景

场景Hook 技术示例
加密/签名重写函数 / Proxy获取加密前的原始参数和结果
网络请求替换 fetch / XHR修改请求参数或抓取敏感信息
防调试/防爬虫替换 console.log / eval绕过无限 debugger / 监控 eval 参数
页面敏感数据getter/setter / Proxy修改关键变量,绕过逻辑判断
游戏逆向函数重写 / Object.defineProperty修改角色属性或游戏数据

⚡ 小技巧:在 Hook 时最好 保留原函数,通过 _原函数名 调用,避免破坏程序逻辑。